Pressidian
花园入口
笔记
项目
关于
实验室
GitHub
花园入口
笔记
项目
关于
实验室
GitHub

KNOWLEDGE PATHS

笔记库
当前位置
笔记库/前端/面试/面经

22 字节-国际化广告创意与品牌

2 分钟阅读 · Note

目录树 578 篇

          • 0 面试技巧&HR面⬇️
          • 1磐松资产-前端实习-一面
          • 2字节跳动-豆包前端实习-全部
          • 3百度-前端实习面试-一面
          • 5光庭-前端实习-一面
          • 6懂车帝-前端实习-一面
          • 7字节-抖音团购-全部
          • 8腾讯-前端-全部
          • 9字节&美团-笔试
          • 10 美团-一面
          • 11 B站-一面
          • 12 腾讯-一面-企业微信团队
          • 13 腾讯-一面-腾讯金融科技
          • 14 腾讯-二面-腾讯金融科技
          • 15 美团-一面-核心本地商业
          • 16 斑马智行-全部
          • 17 字节-一面-飞书
          • 18 美团-二面-核心本地商业
          • 19 心影随形-全部
          • 20 thunderbit-全部
          • 21 converge ai-全部
          • 22 字节-国际化广告创意与品牌
        • 可投递企业
      • 前端技术栈
    • 笔记目录
    • CLAUDE.md
    • Vue 组件与 Render 函数

关联笔记 6

↗类型体操-中等反向链接↗0 面试技巧&HR面⬇️同一路径↗10 美团-一面同一路径↗11 B站-一面同一路径↗12 腾讯-一面-企业微信团队同一路径↗13 腾讯-一面-腾讯金融科技同一路径
  • 22 字节-国际化广告创意与品牌

22 字节-国际化广告创意与品牌

> Last Format Time:6/12/2026 21:03:57

6/12/26 【理由】原文将「一面」「二面」并列写成 H1,且 ## 提问 与 ### CSS 动画... 层级混乱。 原内容:# 一面 / # 二面;### CSS 动画:transition vs animation 紧贴在 ## 提问 下方

一面

6/10/26

提问

主要围绕着项目进行提问,包括但不限于:

  • 控制版面、权限怎么做的,spec
  • 分片下载,你们的分页下载是什么做的
  • 有关hooks的:你在项目中的hooks使用经验是什么
  • css:position、动画两种一种是过渡一种是animation(这个不会)

CSS 动画:transition vs animation

你之前不会,现在必须理解并能说清楚。

特性transitionanimation
触发方式需要状态改变(:hover、类名切换、JS 修改)自动执行,无需交互
循环控制一般执行一次(可配合 transitionend 循环)通过 animation-iteration-count 无限循环
关键帧只有起始和结束两个状态可定义多个关键帧(@keyframes)
精细控制较简单,仅变化一个属性可以每个阶段改变多个属性、设置不同 easing
暂停/播放无法暂停可通过 animation-play-state: paused 暂停
属性示例transition: all 0.3s ease;animation: slideIn 1s ease-in-out 2;
适用场景hover 变色、菜单展开、按钮反馈加载动画、无限旋转、复杂入场/出场效果
关键代码对比
/* transition */
.box {
  width: 100px;
  transition: width 0.5s;
}
.box:hover {
  width: 200px;
}

/* animation */
@keyframes bounce {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-20px); }
}
.animated {
  animation: bounce 0.6s infinite;
}

code(TS)

  • 解释为什么会报错、泛型以及获取元组的第一个类型的函数first()怎么写
  • 实现函数:
题目
fs.readFile('/path/index.js', (err, data) => {
     // handle err and data
}) ;

const readFile = promisify(fs.readFile);

readFile('/path/index.js').then(data => {
    // handle data
}).catch(err => {
    // handle err
})
我的实现
function promisify(func) {
    return function (url) {
        return new Promise((resolve, reject) => {
            const cb = (err, data) => {
                if (data) {
                    resolve(data)
                } else {
                    reject(err)
                }
            }
            func(url, cb)
        })
    }
}
优化后的代码
function promisify(func) {
    // 1. 使用 ...args 接收任意数量的参数
    return function (...args) {
        return new Promise((resolve, reject) => {
            const cb = (err, data) => {
	            // 2. 遵循 error-first 规范,仅通过 err 判断失败
                if (err) {
                    reject(err);
                } else {
                    resolve(data);
                }
            };

			// 3. 将回调函数追加到参数列表末尾
            args.push(cb);
            // 4. 使用 apply 传递参数并保留 this 上下文
            func.apply(this, args);
        });
    };
}

二面

提问

问了业务的具体细节,落实到具体的API了,用的什么函数等等

code

然后就是两道编程题

const viewportWidth = window.innerWidth;
const viewportHeight = window.innerHeight;
console.log(`视口宽度: ${viewportWidth}px, 视口高度: ${viewportHeight}px`);
// 用react hooks实现一个防抖函数

function useDebounce(func, time) {
    let timer = null

    return function (...args) {
        if (!timer) {
            setTimeout(() => {
                func(args)
                clearTimeout(timer)
                timer = null
            }, time)
        }
    }
}
解析模板字符串我的实现,共两个
// tpl(
//     'Hello, ${user.name} !' ,
//     { user: { name: 'Hanmeimei' } }
// )

function tpl(str, obj) {
    if (str.length === 0) return ''
    if (obj === null && typeof obj !== "object") return new Error('obj is not a object!!!')
    const n = str.length

    let start = 0
    let end = n - 1

    while (start < end) {
        console.log(start, end)
        if (start !== '{') start++
        if (end !== '}') end--
    }

    console.log(start, end)

    let path = str.slice(start, end + 1).split('.')

    console.log(path, 'path')

    let value = obj
    for(let i = 0 ;i< path.length;i++){
        value = value[path[i]]
    }

    let ans =  str.slice(0, start - 1) + value + str.slice(end + 1, n)

    return ans
}

tpl('Hello, ${user.name} !', { user: { name: 'Hanmeimei' } })
// =======第二个实现========
// tpl(
//     'Hello, ${user.name} !' ,
//     { user: { name: 'Hanmeimei' } }
// )
function tpl(str, obj) {
    if (str.length === 0) return ''
    if (obj === null && typeof obj !== 'object')
        return new Error('obj is not a object!!!')
    const n = str.length

    let start = str.indexOf('{')
    let end = str.indexOf('}')

    console.log(start, end)

    let path = str.slice(start + 1, end).split('.')

    console.log(path, 'path')

    let value = obj
    for (let i = 0; i < path.length; i++) {
        value = value[path[i]]
    }

    console.log(value);


    let ans = str.slice(0, start - 1) + value + str.slice(end + 1, n)

    return ans
}

console.log(tpl('Hello, ${user.name} !', { user: { name: 'Hanmeimei' } }))
// Hello, Hanmeimei !

反思

肯定是没有了,凉了。。。

6/12/26 没过二面,结束了